<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <title>03Swift和OC区别</title>


  <link href="../../css/semantic/semantic.min.css" rel="stylesheet">
  <link href="../../css/markdown.css" rel="stylesheet">
  <link href="../../css/wtxynavigation.css" rel="stylesheet">
  <script src="../../js/jquery.min.js"></script>
  <script type="text/javascript" src="../../js/include.js"></script>

  <style>
    body{padding-top:0;background:#f7f7f7}
    body>.ui.container{width:100%;padding:0}
    #project-title{background:#6e6e6e;width:100%;line-height:3.572rem;color:#fff;font-size:1.2rem}
    #project-title .title-wrap{font-weight:700;padding:0 12px;width:100%;max-width:1366px!important;min-width:900px;margin:0 auto}
    #project-title .left,#project-title right{display:inline-block}
    #project-title .right{float:right}
    #project-title .right .wiki-actions .menu{left:auto;right:0;margin-top:.4em!important}
    #wiki-preview-container{width:100%;max-width:1366px!important;min-width:900px;padding:0;border:1px solid #e3e9ed;border-top:0}
    #wiki-preview>.ui.segment{margin-top:0;padding:1rem;padding-left:0;border:0}
    .hover-places{display:inline-block}
    #page-detail{width:60%;margin:0 auto}
    #page-detail .title{font-weight:700;font-size:24px;padding:12px 0;border-bottom:1px solid #ccc}
    #page-detail .content{margin-top:15px}
    .content p{word-wrap:break-word}
    #wiki-parent,#wiki-title,#wikis{display:none}
    .ui.grid{padding:0!important}
    #ex-all{cursor:pointer;color:#537c8d}
  </style>
</head>
<body>
  <div class="ui container">
    <div id="project-title">
      <div class="title-wrap">
        <div class="left">
          <i class="icon eye"></i>
          文档预览:
          mianmSDK
        </div>
        <div class="right">
          Export by Gitee
        </div>
      </div>
    </div>

    <div class="ui container" id="wiki-preview-container">
      <div id="wiki-preview">
        <div class="ui segment">
          <div id="page-detail" class="markdown-body">
            <div class='title'>03Swift和OC区别</div><div class='content'><h1>
<a id="swift和oc区别" class="anchor" href="#swift%E5%92%8Coc%E5%8C%BA%E5%88%AB"></a>Swift和OC区别</h1>
<p><strong>关键词</strong>:</p>
<h1>
<a id="1-编程范式" class="anchor" href="#1-%E7%BC%96%E7%A8%8B%E8%8C%83%E5%BC%8F"></a>1. 编程范式</h1>
<ul>
<li>Swift可以面向协议编程, 函数式编程, 面向对象编程
<ul>
<li>函数可以作为变量, 作为参数, 可以作为其他函数的返回值</li>
<li>
</li>
</ul>
</li>
<li>OC 以面向对象编程为主, 当然你可以引入类似<code>ReactiveCocoa</code>的库, 来进行函数式的编程</li>
</ul>
<h1>
<a id="2-类型安全" class="anchor" href="#2-%E7%B1%BB%E5%9E%8B%E5%AE%89%E5%85%A8"></a>2. 类型安全</h1>
<ul>
<li>
<p><strong>Swift</strong>是一门类型安全的语言。鼓励程序员在代码中清楚<strong>明确值的类型</strong>。如果代码中使用一个字符串String，那么你不能错误地传递一个 整型Int 给它。因为Swift是<strong>类型安全</strong>的，它会在代码<strong>编译的时</strong>候做<strong>类型检查</strong>，并且把所有不匹配的类型作为一个错误标记出来。这样使得程序员在开发中尽可能早地发现和修正错误。</p>
</li>
<li>
<p>而<strong>Objective-C</strong>则不然，你声明一个<strong>NSString</strong>变量，仍然可以传一个<strong>NSNumber</strong>给它，尽管编译器会抱怨，但是你仍然可以作为<strong>NSNumber</strong>来使用它。</p>
</li>
</ul>
<h1>
<a id="3-值类型增强" class="anchor" href="#3-%E5%80%BC%E7%B1%BB%E5%9E%8B%E5%A2%9E%E5%BC%BA"></a>3. 值类型增强</h1>
<ul>
<li>
<p>在<strong>Swift</strong>中，典型的有<strong>struct</strong>(结构体)、<strong>enum</strong>(枚举) 以及<strong>tuple</strong>(元组)都是<strong>值类型</strong>。而平时使用的<strong>Int</strong>、<strong>Double</strong>、<strong>Float</strong>、 <strong>String</strong>、 <strong>Array</strong>、 <strong>Dictionary</strong>、 <strong>Set</strong> 其实都是用<strong>结构体</strong>实现的，也是值类型。</p>
</li>
<li>
<p><strong>Objective-C</strong>中，<strong>NSNumber</strong>、<strong>NSString</strong>以及 集合类对象都是指针类型。</p>
</li>
</ul>
<h1>
<a id="4-枚举增强" class="anchor" href="#4-%E6%9E%9A%E4%B8%BE%E5%A2%9E%E5%BC%BA"></a>4. 枚举增强</h1>
<ul>
<li>
<p><strong>Swift</strong>的枚举可以使用<code>整型</code>、<code>浮点型</code>、<code>字符串</code>等，还能拥有属性和方法，甚至支持<code>泛型</code>、<code>协议</code>、<code>扩展</code>等等。</p>
</li>
<li>
<p><strong>Objective-C</strong>里面的<code>枚举</code>则鸡肋很多。</p>
</li>
</ul>
<h1>
<a id="5-泛型" class="anchor" href="#5-%E6%B3%9B%E5%9E%8B"></a>5. 泛型</h1>
<ul>
<li>
<p><code>Swift</code>中支持泛型，也支持泛型的类型约束等特性。</p>
</li>
<li>
<p>苹果推出了<code>Swift2.0</code> 版本，为了让开发者从<code>Objective-C</code>更好地过渡到<strong>Swift</strong>上，苹果也为<strong>Objective-C</strong>带来了<strong>Generics</strong>泛型支持，不过<strong>Objective-C</strong>的泛型约束也仅停留在<strong>编译器警告阶段</strong>。</p>
</li>
</ul>
<h1>
<a id="6-协议和扩展" class="anchor" href="#6-%E5%8D%8F%E8%AE%AE%E5%92%8C%E6%89%A9%E5%B1%95"></a>6. 协议和扩展</h1>
<ul>
<li>
<p><code>Swift</code>对协议的支持更加丰富，配合<code>扩展</code>(<code>extension</code>) 、 <code>泛型</code>、<code>关联类型</code>等可以实现面
向协议编程，从而大大提高代码的灵活性。同时，<strong>Swift</strong> 中的<strong>protocol</strong>还可以用于值类型，如结构体和枚举。</p>
</li>
<li>
<p><strong>Objective-C</strong>的<strong>协议</strong>缺乏强约束，提供的<code>optional</code>特性往往成为很多问题的来源，而如果放弃<code>optional</code>又会让实现代价过大。</p>
</li>
</ul>
<h1>
<a id="7-函数和闭包" class="anchor" href="#7-%E5%87%BD%E6%95%B0%E5%92%8C%E9%97%AD%E5%8C%85"></a>7. 函数和闭包</h1>
<ul>
<li>
<p><strong>Swift</strong>函数是一等公民，可以直接定义函数类型变量，可以作为其他函数参数传递，可以作为函数返回值返回。</p>
</li>
<li>
<p><strong>Objective-C</strong>里面函数仍然是次等公民，需要<code>selector</code>封装或者使用<code>block</code>才能模拟<code>Swift</code>中类似的效果。</p>
</li>
</ul></div>
          </div>
        </div>
      </div>
      </div>
  </div>
</body>
</html>